package jmine.tec.script.persistent.context;

import jmine.tec.script.ScriptExecutionContext;
import jmine.tec.script.persistent.domain.Script;
import jmine.tec.utils.register.Receiver;

/**
 * Interface definida por uma fábrica de contextos de execução de script persistentes
 * 
 * @author lundberg
 */
public interface ScriptExecutionContextFactory extends Receiver<ScriptExecutorRule> {

    /**
     * Cria um contexto de execução do script persistido
     * 
     * @param script script
     * @return ScriptExecutionContext
     */
    ScriptExecutionContext<?> createContext(Script script);

    /**
     * Cria um contexto de execução do script persistido
     * 
     * @param contextInterface contextInterface
     * @param script script
     * @param <C> tipo de contexto
     * @return ScriptExecutionContext
     */
    <C> C createContext(Class<C> contextInterface, Script script);

    /**
     * Cria um contexto de obtenção de dependências do script persistido
     * 
     * @param script script
     * @return ScriptExecutionContext
     */
    ScriptExecutionContext<?> createDependencyContext(Script script);

    /**
     * Cria um contexto de obtenção de dependências do script persistido
     * 
     * @param contextInterface contextInterface
     * @param script script
     * @param <C> tipo de contexto
     * @return ScriptExecutionContext
     */
    <C> C createDependencyContext(Class<C> contextInterface, Script script);

    /**
     * Cria um contexto de validação do script persistido
     * 
     * @param script script
     * @return ScriptExecutionContext
     */
    ScriptExecutionContext<?> createValidationContext(Script script);

    /**
     * Cria um contexto de validação do script persistido
     * 
     * @param contextInterface contextInterface
     * @param script script
     * @param <C> tipo de contexto
     * @return ScriptExecutionContext
     */
    <C> C createValidationContext(Class<C> contextInterface, Script script);
}
